/*
 * Copyright (c) 1996, 2000, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.lang;

/**
 * 表示在静态初始化器中发生了意外异常。
 * 抛出 <code>ExceptionInInitializerError</code> 以指示在评估静态初始化器
 * 或静态变量的初始化器期间发生了异常。
 *
 * <p>从 1.4 版本开始，此异常已被改造以符合通用异常链机制。
 * 可以在构造时提供并通过 {@link #getException()} 方法访问的
 * "保存的可抛出对象" 现在被称为<i>原因</i>，
 * 可以通过 {@link Throwable#getCause()} 方法以及上述"遗留方法"访问。
 *
 * @author  Frank Yellin
 * @since   JDK1.1
 */
public class ExceptionInInitializerError extends LinkageError {
    /**
     * Use serialVersionUID from JDK 1.1.X for interoperability
     */
    private static final long serialVersionUID = 1521711792217232256L;

    /**
     * 如果使用 ExceptionInInitializerError(Throwable thrown) 构造函数
     * 实例化对象，此字段保存异常
     *
     * @serial
     *
     */
    private Throwable exception;

    /**
     * 构造一个 <code>ExceptionInInitializerError</code>，
     * 以 <code>null</code> 作为其详细消息字符串，且没有保存的可抛出对象。
     * 详细消息是描述此特定异常的字符串。
     */
    public ExceptionInInitializerError() {
        initCause(null);  // Disallow subsequent initCause
    }

    /**
     * 通过保存对抛出的 <code>Throwable</code> 对象的引用来构造一个新的
     * <code>ExceptionInInitializerError</code> 类，以便稍后通过
     * {@link #getException()} 方法检索。详细消息字符串设置为 <code>null</code>。
     *
     * @param thrown 抛出的异常
     */
    public ExceptionInInitializerError(Throwable thrown) {
        initCause(null);  // Disallow subsequent initCause
        this.exception = thrown;
    }

    /**
     * 构造一个具有指定详细消息字符串的 ExceptionInInitializerError。
     * 详细消息是描述此特定异常的字符串。详细消息字符串保存以供稍后
     * 通过 {@link Throwable#getMessage()} 方法检索。没有保存的可抛出对象。
     *
     *
     * @param s 详细消息
     */
    public ExceptionInInitializerError(String s) {
        super(s);
        initCause(null);  // Disallow subsequent initCause
    }

    /**
     * 返回在静态初始化期间发生的导致创建此错误的异常。
     *
     * <p>此方法早于通用异常链机制。
     * {@link Throwable#getCause()} 方法现在是获取此信息的首选方法。
     *
     * @return 此 <code>ExceptionInInitializerError</code> 的保存的可抛出对象，
     *         如果此 <code>ExceptionInInitializerError</code> 没有保存的
     *         可抛出对象，则返回 <code>null</code>。
     */
    public Throwable getException() {
        return exception;
    }

    /**
     * 返回此错误的原因（在静态初始化期间发生的导致创建此错误的异常）。
     *
     * @return  此错误的原因，如果原因不存在或未知，则返回 <code>null</code>。
     * @since   1.4
     */
    public Throwable getCause() {
        return exception;
    }
}
